package com.ruoyi.framework.aspectj;

import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
//这一部分的主要的作用是自动填充，在数据新增时自动填充创建人信息和创建时间,是为了自动填充
public class AutoFillAspect {
    // ---------------------- 拦截所有Service层的insert开头方法（如insertTeacher、insertUser）----------------------
    @Before("execution(* com.ruoyi..service..*.insert*(..))")
    public void beforeInsert(JoinPoint joinPoint) {
        // 调用填充逻辑
        fillCreateFields(joinPoint);
    }
    // ---------------------- 修改操作：填充修改人、修改时间 ----------------------
    @Before("execution(* com.ruoyi..service..*.update*(..))")
    public void beforeUpdate(JoinPoint joinPoint) {
        fillUpdateFields(joinPoint);
    }
    // ---------------------- 核心：填充createBy和createTime ----------------------
    private void fillCreateFields(JoinPoint joinPoint) {
        // 1. 获取Service方法的入参（业务实体，如Teacher）
        Object[] args = joinPoint.getArgs();
        if (args == null || args.length == 0) {
            return;
        }

        // 2. 遍历入参，仅处理继承BaseEntity的实体类，而 BaseEntity 中定义了 createBy、createTime 等公共字段
//        这里一定是要注意的是数据库里面必须是特定的字段否则是无法自动填充的
        for (Object arg : args) {
            if (arg instanceof BaseEntity) {
                BaseEntity baseEntity = (BaseEntity) arg;

                // 3. 填充创建人ID（createBy）：从SecurityUtils获取当前登录用户ID
//                String currentUserId = SecurityUtils.getCurrentLoginUserId();
//                if (baseEntity.getCreateBy() == null || baseEntity.getCreateBy().isEmpty()) {
//                    baseEntity.setCreateBy(currentUserId);
//                }

                // 获取当前登录用户的昵称（从SecurityUtils工具类获取）
                String currentUserNickname = SecurityUtils.getCurrentLoginUserNickname();
// 2. 判断createName为空时才填充（避免覆盖手动设置的值）
                if (baseEntity.getCreateBy() == null || baseEntity.getCreateBy().isEmpty()) {
//                    这一行代码就是自动插入
                    baseEntity.setCreateBy(currentUserNickname);
                }



                // 4. 填充创建时间（createTime）：用3.9版本默认DateUtils工具类
                if (baseEntity.getCreateTime() == null) {
//                    获取当前系统的日期时间
                    baseEntity.setCreateTime(DateUtils.getNowDate());
                }
            }
        }
    }


    // ---------------------- 填充修改人（updateBy）和修改时间（updateTime）----------------------
    private void fillUpdateFields(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        if (args == null || args.length == 0) {
            return;
        }

        for (Object arg : args) {
            if (arg instanceof BaseEntity) {
                BaseEntity baseEntity = (BaseEntity) arg;

                // 填充修改人（用户昵称）：每次修改都覆盖为当前登录用户（即使手动设置也替换）
                String currentUserNickname = SecurityUtils.getCurrentLoginUserNickname();
                baseEntity.setUpdateBy(currentUserNickname);

                // 填充修改时间：每次修改都更新为当前系统时间（强制覆盖）
                baseEntity.setUpdateTime(DateUtils.getNowDate());
            }
        }
    }

}